package com.zeng.sboot.oss.bucket;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static com.zeng.sboot.oss.common.AccessKey.accessKeySecret;
import static com.zeng.sboot.oss.common.AccessKey.accessKeyId;
import static com.zeng.sboot.oss.common.AccessKey.endpoint;

public class BucketDemo {

    public static final String bucketName = "fapd2017";

    /**
     * 创建 Bucket
     */
    public void test1() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 创建CreateBucketRequest对象。
        /**
          存储空间的命名规范如下：
           只能包括小写字母、数字和短划线（-）。
           必须以小写字母或者数字开头和结尾。
           长度必须在3~63字节之间。
         */
        CreateBucketRequest createBucketRequest = new CreateBucketRequest("<yourBucketName>");

        // 如果创建存储空间的同时需要指定存储类型以及数据容灾类型, 可以参考以下代码。
        // 此处以设置存储空间的存储类型为标准存储为例。
        createBucketRequest.setStorageClass(StorageClass.Standard);
        // 设置存储空间的存储类型为低频访问类型，默认是标准类型。
        createBucketRequest.setStorageClass(StorageClass.IA);

        // 设置存储空间的权限为公共读，默认是私有。
        createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);

        // 默认情况下，数据容灾类型为本地冗余存储，即DataRedundancyType.LRS。如果需要设置数据容灾类型为同城冗余存储，请替换为DataRedundancyType.ZRS。
        //createBucketRequest.setDataRedundancyType(DataRedundancyType.ZRS);

        // 创建存储空间。
        ossClient.createBucket(createBucketRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 列举 Bucket
     */
    public void test2() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);



        // 1. 列举存储空间。
//        List<Bucket> buckets = ossClient.listBuckets();
//        for (Bucket bucket : buckets) {
//            System.out.println(" - " + bucket.getName());
//        }

        // 2. 以下代码用于列举包含指定前缀（prefix）的存储空间
//        ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
//        // 列举指定前缀的存储空间。
//        listBucketsRequest.setPrefix("fapd-");
//        BucketList bucketList = ossClient.listBuckets(listBucketsRequest);
//        for (Bucket bucket : bucketList.getBucketList()) {
//            System.out.println(" - " + bucket.getName());
//        }

        // 3. 参数marker代表存储空间名称。以下代码用于列举指定marker之后的存储空间
//        ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
//        // 列举指定marker之后的存储空间。
//        listBucketsRequest.setMarker("fapd-");
//        BucketList bucketList = ossClient.listBuckets(listBucketsRequest);
//        for (Bucket bucket : bucketList.getBucketList()) {
//            System.out.println(" - " + bucket.getName());
//        }

        // 4. 以下代码用于列举指定个数（maxKeys）的存储空间
        ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
        // 限定此次列举存储空间的个数为500。默认值为100，最大值为1000。
        listBucketsRequest.setMaxKeys(500);
        BucketList bucketList = ossClient.listBuckets(listBucketsRequest);
        for (Bucket bucket : bucketList.getBucketList()) {
            System.out.println(" - " + bucket.getName());
        }

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 判断指定的存储空间是否存在
     */
    public void test3() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        boolean exists = ossClient.doesBucketExist(bucketName);
        System.out.println(exists);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 获取存储空间所在的地域（称为Region或Location）
     */
    public void test4() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String location = ossClient.getBucketLocation(bucketName);
        System.out.println(location);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 获取存储空间的信息（Info），包括存储空间所在地域、创建日期、权限信息等
     */
    public void test5() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 存储空间的信息包括地域（Region或Location）、创建日期（CreationDate）、拥有者（Owner）、权限（Grants）等。
        BucketInfo info = ossClient.getBucketInfo(bucketName);
        // 获取地域。
        String location = info.getBucket().getLocation();
        // 获取创建日期。
        Date creationDate = info.getBucket().getCreationDate();
        // 获取拥有者信息。
        Owner owner = info.getBucket().getOwner();
        // 获取权限信息。
        Set<Grant> grants = info.getGrants();
        // 获取容灾类型。
        DataRedundancyType type = info.getDataRedundancyType();

        System.out.println(location);
        System.out.println(creationDate);
        System.out.println(owner);
        System.out.println(grants);
        System.out.println(type);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 设置存储空间的访问权限
     */
    public void test6() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 设置存储空间的访问权限为私有。
        // CannedAccessControlList.Private 私有
        // CannedAccessControlList.PublicRead 公共读
        // CannedAccessControlList.PublicReadWrite 公共读写
        ossClient.setBucketAcl(bucketName, CannedAccessControlList.Private);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 删除存储空间
     删除存储空间之前，必须先删除存储空间下的所有文件、LiveChannel和分片上传产生的碎片。
     要删除分片上传产生的碎片，首先使用Bucket.ListMultipartUploads列举出所有碎片，然后使用Bucket.AbortMultipartUpload删除这些碎片。
     */
    public void test7() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 删除存储空间。
        ossClient.deleteBucket("fapd2017");
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 存储空间标签
     * 只有Bucket的拥有者及授权子账户才能为Bucket设置用户标签，否则返回403 Forbidden错误，错误码：AccessDenied。
     * 最多可设置20对Bucket用户标签（Key-Value对）。
     * Key最大长度为64字节，不能以http ://、https://、Aliyun为前缀，且不能为空。
     * Value最大长度为128字节，可以为空。
     * Key和Value必须为UTF-8编码。
     * PutBucketTagging是覆盖语义，即新设置的标签会完全覆盖已有的标签。
     */
    public void test8() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 设置Bucket标签。
        SetBucketTaggingRequest request = new SetBucketTaggingRequest(bucketName);
        request.setTag("<yourTagkey1>", "<yourTagValue1>");
        request.setTag("<yourTagkey2>", "<yourTagValue2>");
        ossClient.setBucketTagging(request);

        // 获取Bucket标签信息。
        TagSet tagSet = ossClient.getBucketTagging(new GenericRequest("<yourBucketName>"));
        Map<String, String> tags = tagSet.getAllTags();

        // 列举带指定标签的Bucket。
        ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
        listBucketsRequest.setTag("<yourTagKey>", "<yourTagValue>");
        BucketList bucketList = ossClient.listBuckets(listBucketsRequest);
        for (Bucket o : bucketList.getBucketList()) {
            System.out.println("list result bucket: " + o.getName());
        }

        // 删除Bucket标签。
        ossClient.deleteBucketTagging(new GenericRequest("<yourBucketName>"));

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 授权策略 Bucket Policy
     */
    public void test9() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 填写policyText。
        String policyText = "{\"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"oss:GetObject\", \"oss:ListObjects\"], \"Resource\": [\"acs:oss:*:*:*/user1/*\"]}], \"Version\": \"1\"}";
        // 设置授权策略。
        ossClient.setBucketPolicy(bucketName, policyText);

        // 获取授权策略。
        GetBucketPolicyResult result = ossClient.getBucketPolicy(bucketName);
        System.out.println("policyText: "+ result.getPolicyText());

        // 删除授权策略。
        ossClient.deleteBucketPolicy(bucketName);

        // 关闭ossClient。
        ossClient.shutdown();
    }



    public static void main(String[] args) {
        BucketDemo bucket = new BucketDemo();

        bucket.test7();
    }
}
